Mapインターフェース
コレクションフレームワークに属するMapインターフェースはListインターフェースと違い、0から始まるインデックスではなくキーとバリューを一対にして要素を管理します。mapインスタンスの宣言はジェネリックの< >の中にキーとバリューの型をカンマ区切りで指定し、要素の登録はputメソッド、取り出しはgetメソッドで行います。
要素の登録では同じキーの複数登録はできませんが、キーが違えば同じバリューの複数登録は可能です。
要素を連続して取り出すには、keySetメソッドでキーの一覧をSetオブジェクトに取り出し、Setオブジェクトから拡張for文でキーを順次取り出しながら、getメソッドでバリューを取出します。下記HashMapを使ったサンプルの15行目から18行目及び21行目から24行目を参照)
Mapインターフェースの実装の一つがHashMapです。
HashMapはハッシュを使って、要素の保存場所を決定するので、要素の追加・削除・変更という操作が、要素の数に関わらず一定の時間で実行可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.Map; import java.util.Set; import java.util.HashMap; public class HashMapSample { public static void main(String[] args) { Map<Integer, String> map= new HashMap<>( ); System.out.println(map.size()); System.out.println( "---------------" ); map.put( 1 , "Bach" ); map.put( 10 , "Chopin" ); map.put( 100 , "Anonymous" ); Set<Integer> keys = map.keySet(); for ( int key: keys) { System.out.println( "key:" + key + " value:" + map.get(key)); } System.out.println( "---------------" ); map.put( 101 , "Anonymous" ); keys = map.keySet(); for ( int key: keys) { System.out.println( "key:" + key + " value:" + map.get(key)); } System.out.println( "---------------" ); System.out.println( "Map contains key:10 (\"Chopin\"):" + map.containsKey( 10 )); map.remove( 100 , "Anonymous" ); System.out.println(map.size()); System.out.println(map); } } |
実行結果
>java HashMapSample
0
—————
key:1 value:Bach
key:100 value:Anonymous
key:10 value:Chopin
—————
key:1 value:Bach
key:100 value:Anonymous
key:101 value:Anonymous
key:10 value:Chopin
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 101=Anonymous, 10=Chopin}
>
また、別の実装としてTreeMapクラスがあります。
基本的な仕様はHashMapと変わりませんが、要素を辞書順にソートして管理します。
実行結果の最後のmap内の要素の呼び出し結果をHashMapのそれと比較してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapSample { public static void main(String[] args) { Map<Integer, String> map= new TreeMap<>( ); System.out.println(map.size()); System.out.println( "---------------" ); map.put( 1 , "Bach" ); map.put( 10 , "Chopin" ); map.put( 100 , "Anonymous" ); Set<Integer> keys = map.keySet(); for ( int key: keys) { System.out.println( "key:" + key + " value:" + map.get(key)); } System.out.println( "---------------" ); map.put( 101 , "Anonymous" ); keys = map.keySet(); for ( int key: keys) { System.out.println( "key:" + key + " value:" + map.get(key)); } System.out.println( "---------------" ); System.out.println( "Map contains key:10 (\"Chopin\"):" + map.containsKey( 10 )); map.remove( 100 , "Anonymous" ); System.out.println(map.size()); System.out.println(map); } } |
実行結果
>java TreeMapSample
0
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
—————
key:1 value:Bach
key:10 value:Chopin
key:100 value:Anonymous
key:101 value:Anonymous
—————
Map contains key:10 (“Chopin”):true
3
{1=Bach, 10=Chopin, 101=Anonymous}
>